А. Колесніков
Третій Ангол, і впала з неба велика зірка, палаючи, як смолоскип, і впала на третину річок та на водні джерела. А ймення зорі полин, і третя частина вод стала полином, і багато людей повмирали з води, тому що вони стали гіркі.
Одкровення Святого Іоанна Богослова, гл. 8, ст. 10,11
Хтось точно підмітив, що розмова про погоду стає цікавим лише при перших ознаках кінця світу. Сьогодні вчені і політики обговорюють проблеми погоди на глобальних форумах, та й прості люди починають потихеньку цікавитися погодою, причому не тільки на найближчі вихідні, а й взагалі ... Атмосфера - величезна, складна, розподілена, динамічна система. Передбачати її поведінка надзвичайно важко, часто просто неможливо. Дивлячись на висять у небесній блакиті хитромудрі хмарні структури, ми не завжди замислюємося про те, наскільки масштабні і драматичні процеси відбуваються там, у височині. Зовсім інше враження залишає прискорена зйомка хмарного неба. Зображення еволюції рояться хмарних мас мимоволі наводить на роздуми про природу часу і сенс земного існування. Схожі, але більш тривожні думки навівають кадри, що зображують розповзання смогу над великими мегаполісами або, гірше того, поступової дифузії ядерного гриба ... Всі ми пам'ятаємо старі чорно-білі навчальні фільми, що розповідають про формування зон зараження після атомного вибуху. Вони класифікуються за ступенем небезпеки. Поблизу епіцентру розташовується "мертва" зона суцільного інтенсивного зараження. Далі, в залежності від напрямку вітру, зони розподіляються у вигляді вкладених один в одного еліпсоїдів розсіювання. У принципі, схожої буде картина розповсюдження і будь-якого іншого забруднювача від точкового джерела, наприклад, від димить труби, реактора, що вибухнув або апокаліптичної зірки з біблійного пророцтва. Процес поширення забруднювача в атмосфері - це процес розсіювання і змішування його частинок з частинками повітря. На хід цього процесу істотний вплив роблять власні руху повітряних мас, тобто вітру. В одній і тій же місцевості вони дмуть в різних напрямках з певною частотою. Дані про частоти вітрів наносяться на особливу діаграму, що має романтичну назву, оспіване у безлічі бардівських пісень, - троянда вітрів. Частинки забруднювача потрапляють від первісного джерела в сусідні області. Потім з областей, що безпосередньо прилягають до джерела, поширюються вже в їх околицях, і так далі. Сам характер цього процесу вказує на те, що для моделювання розсіювання забруднювача в атмосфері можна використовувати підхід, заснований на ідеології клітинних автоматів. У цьому випадку досліджувану ділянку представляється у вигляді клітинного поля. На полі позначаються клітини, в яких знаходяться епіцентри поширення забруднення або зараження. Потім концентрацію забруднювача в кожній клітині поля можна, наприклад, наближено оцінювати за формулою:
(1)
де ak - це масив з дев'яти елементів, що містить ймовірності вітрів відповідних восьми напрямків і ймовірність штилю. Само собою зрозуміло, що дев'ять ймовірностей вітрів різних напрямків, включаючи вірогідність штилю, повинні в сумі давати одиницю. C * k - це вектор з дев'яти елементів, що містить концентрації забруднювача в сусідніх з даною восьми клітинах і в ній самій. Крок за кроком для всіх клітин поля обчислюється сума творів концентрацій у сусідніх восьми осередках на відповідні ймовірності вітрів. До суми додається ще й твір ймовірності штилю на концентрацію забруднювача в самій поточної клітинці. Для нормальної роботи програми необхідно мати дві копії клітинного поля. В одній з копій слід зберігати попереднє покоління, а в іншій - наступне. При зміні поколінь вміст наступного покоління стає попереднім. З розрахунків виключаються крайні ряди осередків. Це робиться для того, щоб уникнути "прикордонних" проблем при застосуванні формули (1). Повторюючи розрахунки багаторазово, ми можемо спостерігати динаміку формування еліпсоїдів розсіювання в часі. При разовому "впорскуванні" забруднювача в яку-небудь клітинку він швидко розсмоктується по клітинному масиву. Для отримання більш виразною картини розсіювання в пропонованому на урізанні фрагменті програмного коду "уприскування" забруднювача у відповідні комірки здійснюється на початку розрахунку кожного чергового покоління. Значення концентрацій викидів вводяться в комірки в якихось довільних одиницях.
Для сприйняття результатів моделювання важлива розфарбування клітин. У наведеному фрагменті програмному використаний алгоритм, що переводить значення концентрацій забруднювача в різні градації яскравості кольорів - від темно-червоного до темно-зеленого. При цьому високі значення концентрацій зображуються відтінками червоного, який, в міру зниження Z, переходить в жовтий, а потім поступово загасає до темно-зеленого кольору.
Звичайно, для по-справжньому точних моделей процесів розсіювання атмосферних забруднювачів слід звертатися до набагато більш прецизійним методиками, ніж та, про яку йшла мова. Але все ж у даному випадку вам немає необхідності вирішувати головоломну систему запаморочливих диференціальних рівнянь в приватних похідних на суперкомп'ютері астрономічної вартості. За допомогою цієї нескладної програмки ви можете виконати якесь невелике цікаве мініісследованіе з комп'ютерного моделювання екологічної ситуації у вашому районі, місті або області в межах часових рамок однієї лабораторної роботи.
DefByte IK
DefInt LN
Dim G As Byte
Dim a (1 To 9) As Single
Dim b (1 To 200, 1 To 200) As Single
Dim c (1 To 200, 1 To 200) As Single
Dim Color As Long
Dim Zmin As Single
Dim Zmax As Single
Dim R As Single
Dim R4 As Single
Dim Z14 As Single
Dim Z24 As Single
Dim Z34 As Single
Private Sub Form_Click ()
a (1) = 0.05
a (2) = 0.05
a (3) = 0.1
a (4) = 0.1
a (5) = 0.1
a (6) = 0.1
a (7) = 0.1
a (8) = 0.15
a (9) = 0.25
z = 7
Zmin = 0
Zmax = 2
R = Zmax - Zmin
R4 = R / 4
Z14 = Zmin + R4
Z24 = Z14 + R4
Z34 = Z24 + R4
n = 50
G = 50
For f = 1 To G
b (35, 35) = z
b (45, 15) = z / 2
For i = 2 To n - 1
For j = 2 To n - 1
c (i, j) = 0
k = 0
For l = -1 To 1
For m = -1 To 1
k = k + 1
c (i, j) = c (i, j) + a (k) * b (i + l, j + m)
Next m
Next l
Next j
Next i
For i = 1 To n
For j = 1 To n
Color = SetColor (c (i, j))
Line (6 * (i - 1), 6 * (j - 1)) - (6 * i - 1, 6 * j - 1), Color, BF
b (i, j) = c (i, j)
Next j
Next i
Next f
End Sub
Public Function SetColor (z As Single) As Long
Dim t As Byte
Select Case z
Case Is <Zmin
SetColor = RGB (0, 63, 0)
Case Zmin To Z14
t = 63 + 192 * (z - Zmin) / R4
SetColor = RGB (0, t, 0)
Case Z14 To Z24
t = 255 * (z - Z14) / R4
SetColor = RGB (t, 255, 0)
Case Z24 To Z34
t = 255 * (1 - (z - Z24) / R4)
SetColor = RGB (255, t, 0)
Case Z34 To Zmax
t = 63 + 192 * (1 - (z - Z34) / R4)
SetColor = RGB (t, 0, 0)
Case Is> Zmax
SetColor = RGB (63, 0, 0)
End Select
End Function